package com.ai.aicodemather.service;

import com.ai.aicodemather.model.dto.AppAddRequest;
import com.ai.aicodemather.model.dto.AppAdminUpdateRequest;
import com.ai.aicodemather.model.dto.AppQueryRequest;
import com.ai.aicodemather.model.dto.AppUpdateRequest;
import com.ai.aicodemather.model.entity.App;
import com.ai.aicodemather.model.entity.User;
import com.ai.aicodemather.model.vo.AppVO;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import jakarta.servlet.http.HttpServletRequest;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 服务层。
 *
 * @author aiCodeMather
 * @since 2023-03-30
 */
public interface AppService extends IService<App> {

    /**
     * 创建应用
     *
     * @param appAddRequest 应用添加请求
     * @param request       HTTP请求
     * @return 应用ID
     */
    Long createApp(AppAddRequest appAddRequest, HttpServletRequest request);

    /**
     * 根据 id 修改自己的应用
     *
     * @param appUpdateRequest 应用更新请求
     * @param request          HTTP请求
     * @return 是否成功
     */
    Boolean updateMyApp(AppUpdateRequest appUpdateRequest, HttpServletRequest request);

    /**
     * 根据 id 删除自己的应用
     *
     * @param id      应用ID
     * @param request HTTP请求
     * @return 是否成功
     */
    Boolean deleteMyApp(Long id, HttpServletRequest request);

    /**
     * 根据 id 查看应用详情
     *
     * @param id 应用ID
     * @return 应用详情
     */
    AppVO getAppVOById(Long id);

    /**
     * 分页查询自己的应用列表
     *
     * @param appQueryRequest 查询请求
     * @param request         HTTP请求
     * @return 应用列表
     */
    com.mybatisflex.core.paginate.Page<AppVO> listMyAppByPage(AppQueryRequest appQueryRequest, HttpServletRequest request);

    /**
     * 分页查询精选的应用列表
     *
     * @param appQueryRequest 查询请求
     * @return 应用列表
     */
    com.mybatisflex.core.paginate.Page<AppVO> listFeaturedAppByPage(AppQueryRequest appQueryRequest);

    /**
     * 管理员根据 id 删除任意应用
     *
     * @param id 应用ID
     * @return 是否成功
     */
    Boolean deleteApp(Long id);

    /**
     * 管理员根据 id 更新任意应用
     *
     * @param appUpdateRequest 应用更新请求
     * @return 是否成功
     */
    Boolean updateApp(AppAdminUpdateRequest appUpdateRequest);

    /**
     * 管理员分页查询应用列表
     *
     * @param appQueryRequest 查询请求
     * @return 应用列表
     */
    com.mybatisflex.core.paginate.Page<AppVO> listAppByPage(AppQueryRequest appQueryRequest);

    /**
     * 获取应用VO
     *
     * @param app 应用实体
     * @return 应用VO
     */
    AppVO getAppVO(App app);

    /**
     * 获取应用VO列表
     *
     * @param appList 应用实体列表
     * @return 应用VO列表
     */
    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 聊天生成代码
     *
     * @param appId
     * @param userMessage
     * @param request
     * @return
     */
    Flux<String> chatToGenCode(Long appId, String userMessage, HttpServletRequest request);

    /**
     * 部署应用
     *
     * @param appId
     * @param user
     * @return
     */
    String deployApp(Long appId, User user);

    /**
     * 获取查询包装器
     *
     * @param appQueryRequest 查询请求
     * @return 查询包装器
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);
}
